﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace PalcoCentral
{
    public partial class pcPainelAdministrativo : Form
    {
        private string addEdit = "";
        Database.person p;
        public pcPainelAdministrativo(Database.person p)
        {
            InitializeComponent();
            this.p = p;
            oldPassTB.PasswordChar = '*';
            newPassTB1.PasswordChar = '*';
            newPassTB2.PasswordChar = '*';
            passTB.PasswordChar ='*';
            reenterPassTB.PasswordChar ='*';
            confirmMyPassCreateAdmin.PasswordChar ='*';

            passRemoveAdminTB.PasswordChar = '*';
            labelLogged.Text = p.personName;
        }

        private void changePassButton_Click(object sender, EventArgs e)
        {
            changePassPannel.Visible = true;
            deleteAdminPannel.Visible = false;
            addEditAdminPannel.Visible = false;

        }

        private void editAdminButton_Click(object sender, EventArgs e)
        {
            changePassPannel.Visible = false;
            deleteAdminPannel.Visible = false;
            addEditAdminPannel.Visible = true;
            loginPassAdminPannel.Enabled = false;
            insertDataAdmin();
            this.addEdit = "edit";
        }

        private void createNewAdminButton_Click(object sender, EventArgs e)
        {
            changePassPannel.Visible = false;
            deleteAdminPannel.Visible = false;
            addEditAdminPannel.Visible = true;
            loginPassAdminPannel.Enabled = true;
            nameAdminP.ResetText();
            emailAdminP.ResetText();
            telmAdminP.ResetText();
            observationsAdminP.ResetText();
            nifAdminP.ResetText();
            biAdminP.ResetText();
            loginTB.ResetText();
            passTB.ResetText();
            reenterPassTB.ResetText();
            confirmMyPassCreateAdmin.ResetText();
            this.addEdit = "add";
        }

        private void deleteAdminButton_Click(object sender, EventArgs e)
        {
            changePassPannel.Visible = false;
            deleteAdminPannel.Visible = true;
            addEditAdminPannel.Visible = false;
            passRemoveAdminTB.ResetText();
            Library.OperationStatus os = Database.PersonDBAdapter.getInstance().listOfAdmins();
            if (os.sucess)
            {
                List<Database.person> res = (List<Database.person>)os.res;
                listaAdmins.DataSource = res;
                listaAdmins.Update();

                //IMPEDIR REMOÇÃO DO ULTIMO USER ADMIN PRESENTE NA BD
                if (res.Count <= 1)
                {
                    deleteAdminConfirm.Enabled = false;
                    passRemoveAdminTB.Enabled = false;
                }
                else {
                    deleteAdminConfirm.Enabled = true;
                    passRemoveAdminTB.Enabled = true;
                }
            }

        }

        private void closeButton_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void deleteAdminConfirm_Click(object sender, EventArgs e)
        {

            Database.person person = (Database.person)listaAdmins.SelectedItem;
            if (passRemoveAdminTB.Text == p.admin.password && person != this.p && (!person.admin.login.ToLower().Equals("admin")))
            {
                if (person == null)
                {
                    Library.Utils.atentionFields("Nenhum elemento da lista seleccionado.", "Atenção");
                    return;
                }

                if (MessageBox.Show("Deseja mesmo remover o Administrador " + person.personName + " da base de dados?", "Remover pessoa", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    Library.OperationStatus os = Database.PersonDBAdapter.getInstance().removePerson(person);
                    if (os.sucess)
                    {
                        Library.Utils.sucessFields("Administrador removido com sucesso.", "Operação bem sucedida");
                        passRemoveAdminTB.ResetText();
                        deleteAdminButton.PerformClick();

                    }
                    else
                    {
                        Library.Utils.errorFields("Ocorreu um erro a remover o Administrador.", "Erro na operação");
                    }
                }
            }
            else if (passRemoveAdminTB.Text != p.admin.password)
            {
                Library.Utils.errorFields("Password incorrecta.", "Erro na operação");
            }
            else if (person == this.p)
            {
                Library.Utils.errorFields("Está a tentar eliminar-se a si mesmo(a).", "Erro na operação");
            }
            else {
                Library.Utils.errorFields("Este utilizador não pode ser apagado.", "Acção não permitida");
            }
        }

        private void saveNewPassBut_Click(object sender, EventArgs e)
        {
            if ((oldPassTB.Text == p.admin.password) && (newPassTB1.Text == newPassTB2.Text))
            {
                p.admin.password = newPassTB1.Text;
                Library.OperationStatus os = Database.PersonDBAdapter.getInstance().editAdmin(p.admin);
                if (os.sucess)
                {
                    Library.Utils.sucessFields("Password alterada com sucesso.", "Operação bem sucedida");
                    cancel.PerformClick();
                }
                else
                {
                    Library.Utils.errorFields("Ocorreu um erro a alterar a password.", "Erro na operação");
                    cancel.PerformClick();
                }
            }
            else
            {
                Library.Utils.errorFields("Passwords incorrectas.", "Erro na operação");
            }
        }

        private void cancel_Click(object sender, EventArgs e)
        {
            oldPassTB.ResetText();
            newPassTB1.ResetText();
            newPassTB2.ResetText();
        }

        private void addAdminButton_Click(object sender, EventArgs e)
        {
            if (addEdit.Equals("add")) {
                addAdmin();
            }
            else if (addEdit.Equals("edit")) {
                editAdmin();
            }
        }

        private void addAdmin() {
            if ((confirmMyPassCreateAdmin.Text == p.admin.password) && (passTB.Text == reenterPassTB.Text))
            {
                PalcoCentral.Library.Person admin=new PalcoCentral.Library.Person();
                
                admin.Observations = observationsAdminP.Text;
                if ((!string.IsNullOrEmpty(nameAdminP.Text)) && (!string.IsNullOrEmpty(emailAdminP.Text)) && (!string.IsNullOrEmpty(telmAdminP.Text)))
                {
                    admin.Name = nameAdminP.Text;
                    admin.Email = emailAdminP.Text;
                    admin.Mobile = telmAdminP.Text;
                }
                else
                {
                    Library.Utils.atentionFields("Campos obrigatórios por preencher.", "Atenção");
                    return;
                }
                Int64 bi;
                if (Int64.TryParse(biAdminP.Text, out bi))
                {
                    admin.Bi = bi;
                }
                else
                {
                    Library.Utils.errorFields("Introduza um numero de BI válido.", "Erro na operação");
                    return;
                }
                Int64 nif;
                if (Int64.TryParse(nifAdminP.Text, out nif))
                {
                    admin.Nif = nif;
                }
                else
                {
                    Library.Utils.errorFields("Introduza um NIF válido.", "Erro na operação");
                    return;
                }
                admin.PersonRole = Library.PersonRole.Admin;
                admin.PersonActive = true;

                if (string.IsNullOrEmpty(loginTB.Text) || string.IsNullOrEmpty(passTB.Text) || loginTB.Text.Contains(" "))
                {
                    Library.Utils.errorFields("Login e/ou Password de novo utilizador inválidos.", "Erro na operação");
                }
                else {
                    Library.OperationStatus os = Database.PersonDBAdapter.getInstance().AddAdmin(admin, loginTB.Text, passTB.Text);
                    if (os.sucess)
                    {
                        Library.Utils.sucessFields("Administrador " + admin.Name + " foi inserido com sucesso.", "Operação bem sucedida");
                        nameAdminP.ResetText();
                        emailAdminP.ResetText();
                        telmAdminP.ResetText();
                        observationsAdminP.ResetText();
                        nifAdminP.ResetText();
                        biAdminP.ResetText();
                        loginTB.ResetText();
                        passTB.ResetText();
                        reenterPassTB.ResetText();
                        confirmMyPassCreateAdmin.ResetText();
                    }
                    else
                    {
                        Library.Utils.errorFields("O novo Administrador não foi inserido.", "Erro na operação");
                        string error = os.errorMessage; //Mensagem de erro
                        Exception ex = os.ex; //Execao
                    }
                }
            }
            else
            {
                Library.Utils.errorFields("Erro nas passwords.\nVerique se as passwords correspondem e/ou se a sua pass está correcta.", "Erro na operação");
            }
        }

        private void insertDataAdmin() {
            nameAdminP.Text = p.personName;
            emailAdminP.Text = p.email;
            nifAdminP.Text = Convert.ToString(p.nif);
            biAdminP.Text = Convert.ToString(p.bi);
            telmAdminP.Text = p.mobile_number;
            observationsAdminP.Text = p.observationsPerson;

        }

        private void editAdmin() {
            if ((confirmMyPassCreateAdmin.Text == p.admin.password))
            {
                Database.person admin = p;
                admin.observationsPerson= observationsAdminP.Text;
                if ((!string.IsNullOrEmpty(nameAdminP.Text)) && (!string.IsNullOrEmpty(emailAdminP.Text)) && (!string.IsNullOrEmpty(telmAdminP.Text)))
                {
                    admin.personName = nameAdminP.Text;
                    admin.email = emailAdminP.Text;
                    admin.mobile_number = telmAdminP.Text;
                    admin.personId = p.personId;
                }
                else
                {
                    Library.Utils.atentionFields("Campos obrigatórios por preencher.", "Atenção");
                    return;
                }
                Int64 bi;
                if (Int64.TryParse(biAdminP.Text, out bi))
                {
                    admin.bi = bi;
                }
                else
                {
                    Library.Utils.errorFields("Introduza um numero de BI válido.", "Erro na operação");
                    return;
                }
                Int64 nif;
                if (Int64.TryParse(nifAdminP.Text, out nif))
                {
                    admin.nif = nif;
                }
                else
                {
                    Library.Utils.errorFields("Introduza um NIF válido.", "Erro na operação");
                    return;
                }
                admin.personRole= "Admin";
                admin.personStatus = "Activo";
                Library.OperationStatus os = Database.PersonDBAdapter.getInstance().editPerson(admin);
                if (os.sucess)
                {
                    Library.Utils.sucessFields("Administrador " + admin.personName+ " foi editado com sucesso.", "Operação bem sucedida");
                    nameAdminP.ResetText();
                    emailAdminP.ResetText();
                    telmAdminP.ResetText();
                    observationsAdminP.ResetText();
                    nifAdminP.ResetText();
                    biAdminP.ResetText();
                    loginTB.ResetText();
                    passTB.ResetText();
                    reenterPassTB.ResetText();
                    confirmMyPassCreateAdmin.ResetText();
                }
                else
                {
                    Library.Utils.errorFields("O novo Administrador não foi editado.", "Erro na operação");
                    string error = os.errorMessage; //Mensagem de erro
                    Exception ex = os.ex; //Execao
                }
            }
            else
            {
                Library.Utils.errorFields("A sua password está incorrecta.", "Erro na operação");
            }
        }
    }
}
